@citolab/qti-components 6.9.1-beta.65 → 6.9.1-beta.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -21,14 +21,29 @@
21
21
  "engines": {
22
22
  "node": ">=20.0.0"
23
23
  },
24
- "version": "6.9.1-beta.65",
24
+ "version": "6.9.1-beta.67",
25
25
  "type": "module",
26
26
  "exports": {
27
- "./qti-components": "./dist/qti-components/index.js",
28
- "./qti-transformers": "./dist/qti-transformers/index.js",
29
- "./qti-item": "./dist/qti-item/index.js",
30
- "./qti-loader": "./dist/qti-loader/index.js",
31
- "./item.css": "./dist/item.css"
27
+ "./qti-components": {
28
+ "import": "./dist/qti-components/index.js",
29
+ "require": "./dist/qti-components/index.cjs"
30
+ },
31
+ "./qti-transformers": {
32
+ "import": "./dist/qti-transformers/index.js",
33
+ "require": "./dist/qti-transformers/index.cjs"
34
+ },
35
+ "./qti-item": {
36
+ "import": "./dist/qti-item/index.js",
37
+ "require": "./dist/qti-item/index.cjs"
38
+ },
39
+ "./qti-loader": {
40
+ "import": "./dist/qti-loader/index.js",
41
+ "require": "./dist/qti-loader/index.cjs"
42
+ },
43
+ "./item.css": "./dist/item.css",
44
+ "./index.js": "./dist/index.js",
45
+ "./index.min.js": "./dist/index.min.js",
46
+ "./index.global.js": "./dist/index.global.js"
32
47
  },
33
48
  "types": "./dist/qti-components/index.d.ts",
34
49
  "typesVersions": {
@@ -53,46 +68,69 @@
53
68
  "./dist/item.css"
54
69
  ],
55
70
  "scripts": {
56
- "test": "vitest run",
57
71
  "dev": "vite",
72
+ "test": "vitest run",
58
73
  "build": "wireit",
59
- "build-lib": "tsx scripts/build.ts",
60
- "watch-lib": "nodemon --watch \"src/**\" --ext \"ts,json,css\" --ignore \"src/**/*.spec.ts\" --exec \"tsx scripts/build.ts\" watch",
74
+ "watch": "wireit",
75
+ "attw": "wireit",
76
+ "lint": "wireit",
77
+ "cem": "wireit",
78
+ "css": "wireit",
61
79
  "storybook": "storybook dev -p 6006",
62
80
  "build-storybook": "storybook build",
63
- "storybook:build": "storybook build",
64
81
  "storybook:test": "test-storybook",
65
- "cem": "cem analyze --watch",
66
- "lint": "eslint src/lib/**",
67
- "arethetypeswrong": "wireit",
68
- "----hooks----": "-",
69
- "prepublishOnly": "echo 'calling prepublishOnly as npm lifecycle hook to build-lib!' && npm run build-lib",
70
- "postpublish": "echo 'posthook for prosperity, does nothing for now!'",
71
- "test:browser": "vitest --browser.headless=false",
72
82
  "chromatic": "node chromatic-runner.cjs",
83
+ "----hooks----": "-",
84
+ "prepublishOnly": "npm run build",
73
85
  "prepare": "husky"
74
86
  },
75
87
  "wireit": {
88
+ "watch": {
89
+ "env": {
90
+ "NODE_ENV": "development"
91
+ },
92
+ "command": "tsup",
93
+ "output": [
94
+ "dist"
95
+ ]
96
+ },
76
97
  "build": {
77
- "command": "tsc"
98
+ "env": {
99
+ "NODE_ENV": "production"
100
+ },
101
+ "command": "tsup --silent",
102
+ "dependencies": [
103
+ "cem",
104
+ "css"
105
+ ],
106
+ "clean": true
107
+ },
108
+ "lint": {
109
+ "command": "eslint --color --cache --cache-location .eslintcache src/lib/**/*.ts"
110
+ },
111
+ "cem": {
112
+ "command": "cem analyze --litelement --outdir \"dist\""
113
+ },
114
+ "css": {
115
+ "command": "npx --yes tsx scripts/make-css.ts --outdir \"dist\""
78
116
  },
79
- "arethetypeswrong": {
80
- "command": "attw --pack",
117
+ "attw": {
118
+ "command": "attw --pack --exclude-entrypoints ./item.css ./index.js ./index.global.js ./index.min.js",
81
119
  "dependencies": [
82
- "build-lib"
120
+ "build"
83
121
  ]
84
122
  }
85
123
  },
86
124
  "peerDependencies": {
87
125
  "@lit/context": "^1.1.2",
88
- "lit": "^3.2.0"
126
+ "lit": "^3.2.0",
127
+ "lit-html": "^3.2.1"
89
128
  },
90
129
  "devDependencies": {
91
130
  "@arethetypeswrong/cli": "^0.16.4",
92
131
  "@chromatic-com/storybook": "^3.2.2",
93
132
  "@custom-elements-manifest/analyzer": "^0.10.3",
94
133
  "@eslint/js": "^9.13.0",
95
- "@lit-labs/preact-signals": "^1.0.2",
96
134
  "@lit/context": "^1.1.3",
97
135
  "@ljcl/storybook-addon-cssprops": "^4.0.0",
98
136
  "@storybook/addon-a11y": "^8.4.2",
@@ -112,9 +150,11 @@
112
150
  "@typescript-eslint/eslint-plugin": "^8.12.2",
113
151
  "@typescript-eslint/parser": "^8.12.2",
114
152
  "@vitest/browser": "^2.1.4",
115
- "@wdio/cli": "^9.2.6",
116
153
  "autoprefixer": "^10.4.20",
117
154
  "chromatic": "^11.16.3",
155
+ "custom-element-eslint-rule-generator": "^1.0.1",
156
+ "custom-element-jsx-integration": "^1.5.3",
157
+ "custom-element-react-wrappers": "^1.6.8",
118
158
  "custom-element-vs-code-integration": "^1.4.1",
119
159
  "dotenv": "^16.4.5",
120
160
  "eslint": "^9.13.0",
@@ -1,2 +0,0 @@
1
- var j=Object.defineProperty,k=Object.defineProperties,l=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyDescriptors;var h=Object.getOwnPropertySymbols;var n=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;var i=(c,a,b)=>a in c?j(c,a,{enumerable:!0,configurable:!0,writable:!0,value:b}):c[a]=b,p=(c,a)=>{for(var b in a||(a={}))n.call(a,b)&&i(c,b,a[b]);if(h)for(var b of h(a))o.call(a,b)&&i(c,b,a[b]);return c},q=(c,a)=>k(c,m(a));var r=(c,a,b,e)=>{for(var d=e>1?void 0:e?l(a,b):a,f=c.length-1,g;f>=0;f--)(g=c[f])&&(d=(e?g(a,b,d):g(d))||d);return e&&d&&j(a,b,d),d};export{p as a,q as b,r as c};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,24 +0,0 @@
1
- var b=String.raw,T=b`<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
2
- <xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
3
- <xsl:template match="@*|node()">
4
- <xsl:copy>
5
- <xsl:apply-templates select="@*|node()"/>
6
- </xsl:copy>
7
- </xsl:template>
8
-
9
- <!-- remove existing namespaces -->
10
- <xsl:template match="*">
11
- <!-- remove element prefix -->
12
- <xsl:element name="{local-name()}">
13
- <!-- process attributes -->
14
- <xsl:for-each select="@*">
15
- <!-- remove attribute prefix -->
16
- <xsl:attribute name="{local-name()}">
17
- <xsl:value-of select="."/>
18
- </xsl:attribute>
19
- </xsl:for-each>
20
- <xsl:apply-templates/>
21
- </xsl:element>
22
- </xsl:template>
23
- </xsl:stylesheet>`;function f(e,r,t){e.querySelectorAll(r).forEach(s=>{let n=`${r}-${t}`,o=x(s,n);s.replaceWith(o)})}function g(e,r){e.querySelectorAll("*").forEach(t=>{let s=t.classList;s&&s.forEach(n=>{if(n.startsWith(`${r}:`)){let o=n.slice(`${r}:`.length),i=`${t.nodeName}-${o}`,c=x(t,i);t.replaceWith(c)}})})}function x(e,r){let t=document.createElement(r);for(let s of e.attributes)t.setAttribute(s.name,s.value);for(;e.firstChild;)t.appendChild(e.firstChild);return t}function h(e){let r=[];return e.querySelectorAll("qti-assessment-item-ref").forEach(t=>{let s=t.getAttribute("identifier"),n=t.getAttribute("href"),o=t.getAttribute("category");r.push({identifier:s,href:n,category:o})}),r}var p=null;function a(e,r=!1){return r&&p!==null&&p.abort(),new Promise((t,s)=>{let n=new XMLHttpRequest;p=n,n.open("GET",e,!0),n.responseType="document",n.onload=()=>{n.status>=200&&n.status<300?t(n.responseXML):s(n.statusText)},n.onerror=()=>{s(n.statusText)},n.send()})}function m(e){return new DOMParser().parseFromString(e,"text/xml")}function l(e){let r=new XSLTProcessor,t=new DOMParser().parseFromString(T,"text/xml");return r.importStylesheet(t),r.transformToFragment(e,document)}function d(e,r){r.endsWith("/")||(r+="/"),e.querySelectorAll("[src],[href],[primary-path]").forEach(t=>{var o;let s="";t.getAttribute("src")&&(s="src"),t.getAttribute("href")&&(s="href"),t.getAttribute("primary-path")&&(s="primary-path");let n=(o=t.getAttribute(s))==null?void 0:o.trim();if(!n.startsWith("data:")&&!n.startsWith("http")){let i=r+encodeURI(n);t.setAttribute(s,i)}})}function A(e){e.querySelectorAll('qti-custom-operator[class="js.org"] > qti-base-value').forEach(t=>{let s=document.createComment(t.textContent);t.replaceChild(s,t.firstChild)})}function y(e){e.querySelectorAll("qti-stylesheet").forEach(r=>r.remove())}var D=()=>{let e,r={async load(t,s=!1){return new Promise((n,o)=>{a(t,s).then(i=>(e=i,r.path(t.substring(0,t.lastIndexOf("/"))),n(r)))})},parse(t){return e=m(t),r},path:t=>(d(e,t),r),fn(t){return t(e),r},pciHooks(t){let s=["hook","module"],n=t.substring(0,t.lastIndexOf("/"));for(let o of s)e.querySelectorAll("["+o+"]").forEach(c=>{let u=c.getAttribute(o);!u.startsWith("data:")&&!u.startsWith("http")&&(c.setAttribute("base-url",t),c.setAttribute("module",n+"/"+encodeURI(u+(u.endsWith(".js")?"":".js"))))});return r},extendElementName:(t,s)=>(f(e,t,s),r),extendElementsWithClass:(t="extend")=>(g(e,t),r),customInteraction(t,s){let n=e.querySelector("qti-custom-interaction"),o=n.querySelector("object");return n.setAttribute("data-base-ref",t),n.setAttribute("data-base-item",t+s),n.setAttribute("data",o.getAttribute("data")),n.setAttribute("width",o.getAttribute("width")),n.setAttribute("height",o.getAttribute("height")),n.removeChild(o),r},convertCDATAtoComment(){return A(e),r},stripStyleSheets(){return y(e),r},html(){return new XMLSerializer().serializeToString(l(e))},xml(){return new XMLSerializer().serializeToString(e)},htmlDoc(){return l(e)},xmlDoc(){return e}};return r};var w=()=>{let e,r={async load(t){return new Promise((s,n)=>{a(t).then(o=>(e=o,s(r)))})},parse(t){e=m(t)},assessmentTest(){let t=e.querySelector('resource[type="imsqti_test_xmlv3p0"]');return{href:t.getAttribute("href"),identifier:t.getAttribute("identifier")}}};return r};var F=()=>{let e,r={async load(t){return new Promise((s,n)=>{a(t).then(o=>(e=o,s(r)))})},parse(t){return e=m(t),r},fn(t){return t(e),r},items(){return h(e)},html(){return new XMLSerializer().serializeToString(l(e))},xml(){return new XMLSerializer().serializeToString(e)},htmlDoc(){return l(e)},xmlDoc(){return e}};return r};export{D as a,w as b,F as c};
24
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS1tYW5pZmVzdC50cyIsICIuLi9zcmMvbGliL3F0aS10cmFuc2Zvcm1lcnMvcXRpLXRyYW5zZm9ybS10ZXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCB4bWwgPSBTdHJpbmcucmF3O1xuXG4vKiAgIDwhLS0gY29udmVydCBDREFUQSB0byBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cInRleHQoKVtjb250YWlucyguLCAnQ0RBVEEnKV1cIj5cbiAgPHhzbDpjb21tZW50PlxuICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgPC94c2w6Y29tbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuKi9cblxuLypcbiAgPCEtLSByZW1vdmUgeG1sIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiY29tbWVudCgpXCIgLz5cbiAgKi9cblxuY29uc3QgeG1sVG9IVE1MID0geG1sYDx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG48eHNsOm91dHB1dCBtZXRob2Q9XCJodG1sXCIgdmVyc2lvbj1cIjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBpbmRlbnQ9XCJ5ZXNcIiAvPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQCp8bm9kZSgpXCI+XG4gICAgPHhzbDpjb3B5PlxuICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiQCp8bm9kZSgpXCIvPlxuICAgIDwveHNsOmNvcHk+XG4gIDwveHNsOnRlbXBsYXRlPlxuXG4gIDwhLS0gcmVtb3ZlIGV4aXN0aW5nIG5hbWVzcGFjZXMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIqXCI+XG4gICAgPCEtLSByZW1vdmUgZWxlbWVudCBwcmVmaXggLS0+XG4gICAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgPCEtLSBwcm9jZXNzIGF0dHJpYnV0ZXMgLS0+XG4gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD1cIkAqXCI+XG4gICAgICAgIDwhLS0gcmVtb3ZlIGF0dHJpYnV0ZSBwcmVmaXggLS0+XG4gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgICAgICAgPC94c2w6YXR0cmlidXRlPlxuICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPlxuICA8L3hzbDplbGVtZW50PlxuPC94c2w6dGVtcGxhdGU+XG48L3hzbDpzdHlsZXNoZWV0PmA7XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBlbGVtZW50cyB3aXRoIGEgc3BlY2lmaWMgdGFnIG5hbWUgYnkgYWRkaW5nIGFuIGV4dGVuc2lvbiBzdWZmaXhcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHt0YWdOYW1lfS0ke2V4dGVuc2lvbn1gO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgfSk7XG59XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBhbnkgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgcGF0dGVybiAoZS5nLiwgXCJleHRlbmQ6c3VmZml4XCIpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCBjbGFzc05hbWVQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGAke2NsYXNzTmFtZVBhdHRlcm59OmApKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lLnNsaWNlKGAke2NsYXNzTmFtZVBhdHRlcm59OmAubGVuZ3RoKTtcbiAgICAgICAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7ZWxlbWVudC5ub2RlTmFtZX0tJHtzdWZmaXh9YDtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIGEgbmV3IHRhZyBuYW1lIGFuZCBjb3B5IGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSkge1xuICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWdOYW1lKTtcbiAgLy8gQ29weSBhdHRyaWJ1dGVzXG4gIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG4gIC8vIENvcHkgY2hpbGQgbm9kZXNcbiAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgaXRlbXM6IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdID0gW107XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tcmVmJykuZm9yRWFjaChlbCA9PiB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGVsLmdldEF0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgICBpdGVtcy5wdXNoKHsgaWRlbnRpZmllciwgaHJlZiwgY2F0ZWdvcnkgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbmxldCBjdXJyZW50UmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRYTUwodXJsLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSkge1xuICBpZiAoY2FuY2VsUHJldmlvdXNSZXF1ZXN0ICYmIGN1cnJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgY3VycmVudFJlcXVlc3QuYWJvcnQoKTsgLy8gQWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxYTUxEb2N1bWVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjdXJyZW50UmVxdWVzdCA9IHhocjsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbERvY3VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCB4bWxGcmFnbWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sRG9jdW1lbnQsICd0ZXh0L3htbCcpO1xuICByZXR1cm4geG1sRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0hUTUwoeG1sRnJhZ21lbnQ6IERvY3VtZW50KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7XG4gIGNvbnN0IHhzbHREb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sVG9IVE1MLCAndGV4dC94bWwnKTtcbiAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsdERvY3VtZW50KTtcbiAgY29uc3QgaXRlbUhUTUxGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbEZyYWdtZW50LCBkb2N1bWVudCk7XG4gIHJldHVybiBpdGVtSFRNTEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsIGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgaWYgKCFsb2NhdGlvbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9jYXRpb24gKz0gJy8nO1xuICB9XG5cbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY10sW2hyZWZdLFtwcmltYXJ5LXBhdGhdJykuZm9yRWFjaChlbFdpdGhTcmMgPT4ge1xuICAgIGxldCBhdHRyOiAnc3JjJyB8ICdocmVmJyB8ICdwcmltYXJ5LXBhdGgnIHwgJycgPSAnJztcblxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgYXR0ciA9ICdzcmMnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBhdHRyID0gJ2hyZWYnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJykpIHtcbiAgICAgIGF0dHIgPSAncHJpbWFyeS1wYXRoJztcbiAgICB9XG4gICAgY29uc3QgYXR0clZhbHVlID0gZWxXaXRoU3JjLmdldEF0dHJpYnV0ZShhdHRyKT8udHJpbSgpO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgY29uc3QgbmV3U3JjVmFsdWUgPSBsb2NhdGlvbiArIGVuY29kZVVSSShhdHRyVmFsdWUpO1xuICAgICAgZWxXaXRoU3JjLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdTcmNWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBjZGF0YUVsZW1lbnRzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWN1c3RvbS1vcGVyYXRvcltjbGFzcz1cImpzLm9yZ1wiXSA+IHF0aS1iYXNlLXZhbHVlJyk7XG4gIGNkYXRhRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjb21tZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGQoY29tbWVudFRleHQsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICAvLyByZW1vdmUgcXRpLXN0eWxlc2hlZXQgdGFnXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdHlsZXNoZWV0JykuZm9yRWFjaChzdHlsZXNoZWV0ID0+IHN0eWxlc2hlZXQucmVtb3ZlKCkpO1xufVxuIiwgIi8qKlxuICogQnJvd3NlciBiYXNlZCBRVEktWE1MIHRvIEhUTUwgdHJhbnNmb3JtZXIuXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtSXRlbSgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgncGF0aC90by94bWwvZmlsZS54bWwnKTtcbiAqIHF0aVRyYW5zZm9ybWVyLnBhdGgoJy9hc3Nlc3NtZW50SXRlbS9pdGVtQm9keScpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICogY29uc3QgaHRtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLmh0bWxkb2MoKTtcbiAqIGNvbnN0IHhtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLnhtbGRvYygpO1xuICpcbiAqIHF0aVRyYW5zZm9ybUl0ZW0oKS5wYXJzZShzdG9yeVhNTCkuaHRtbCgpXG4gKi9cblxuaW1wb3J0IHtcbiAgY29udmVydENEQVRBdG9Db21tZW50LFxuICBleHRlbmRFbGVtZW50TmFtZSxcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MsXG4gIGxvYWRYTUwsXG4gIHBhcnNlWE1MLFxuICBzZXRMb2NhdGlvbixcbiAgc3RyaXBTdHlsZVNoZWV0cyxcbiAgdG9IVE1MXG59IGZyb20gJy4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gIGxvYWQ6ICh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0PzogYm9vbGVhbikgPT4gUHJvbWlzZTx0cmFuc2Zvcm1JdGVtQXBpPjtcbiAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBjaUhvb2tzOiAodXJpOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnROYW1lOiAoZWxlbWVudE5hbWU6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW0/OiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGN1c3RvbUludGVyYWN0aW9uOiAoYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQ6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHN0cmlwU3R5bGVTaGVldHM6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGh0bWw6ICgpID0+IHN0cmluZztcbiAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtSXRlbSA9ICgpID0+IHtcbiAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcblxuICBjb25zdCBhcGk6IHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gICAgYXN5bmMgbG9hZCh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHR5cGVvZiBhcGk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxvYWRYTUwodXJpLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAvLyBzZXQgdGhlIGJhc2UgcGF0aCBmb3IgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMsXG4gICAgICAgICAgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gc2V0IHRoZSBiYXNlIHBhdGggdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxzZSB5b3UgY2FuIHVzZSB0aGUgcGF0aCBtZXRob2QgdG8gc2V0IGl0XG4gICAgICAgICAgYXBpLnBhdGgodXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSkpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBzZXRMb2NhdGlvbih4bWxGcmFnbWVudCwgbG9jYXRpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKTogdHlwZW9mIGFwaSB7XG4gICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGNpSG9va3ModXJpOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2hvb2snLCAnbW9kdWxlJ107XG4gICAgICBjb25zdCBkb2N1bWVudFBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlcyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlICsgJ10nKTtcbiAgICAgICAgc3JjQXR0cmlidXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSE7XG4gICAgICAgICAgaWYgKCFzcmNWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFzcmNWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgIC8vIEp1c3QgcGFzdGUgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNyYyBsb2NhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnRyb290UGF0aFxuICAgICAgICAgICAgLy8gb2xkIHBjaXMgY2FuIGhhdmUgYSAuanMsIG5ldyBwY2kncyBkb24ndFxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2Jhc2UtdXJsJywgdXJpKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoICsgJy8nICsgZW5jb2RlVVJJKHNyY1ZhbHVlICsgKHNyY1ZhbHVlLmVuZHNXaXRoKCcuanMnKSA/ICcnIDogJy5qcycpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnROYW1lOiAodGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQsIHRhZ05hbWUsIGV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbTogc3RyaW5nID0gJ2V4dGVuZCcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50LCBwYXJhbSk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY3VzdG9tSW50ZXJhY3Rpb24oYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbiA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKTtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0ID0gcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXJlZicsIGJhc2VSZWYpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtaXRlbScsIGJhc2VSZWYgKyBiYXNlSXRlbSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnJlbW92ZUNoaWxkKHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHN0cmlwU3R5bGVTaGVldHMoKTogdHlwZW9mIGFwaSB7XG4gICAgICBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBodG1sKCkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgfSxcbiAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIGh0bWxEb2MoKSB7XG4gICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICByZXR1cm4geG1sRnJhZ21lbnQ7IC8vIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwaTtcbn07XG4iLCAiaW1wb3J0IHsgbG9hZFhNTCwgcGFyc2VYTUwgfSBmcm9tIFwiLi9xdGktdHJhbnNmb3JtZXJzXCI7XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1NYW5pZmVzdCA9ICgpOiB7XG4gICAgbG9hZDogKHVyaTogc3RyaW5nKSA9PiBQcm9taXNlPHR5cGVvZiBhcGk+O1xuICAgIGFzc2Vzc21lbnRUZXN0OiAoKSA9PiB7IGhyZWY6IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH07XG4gIH0gPT4ge1xuICAgIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG4gIFxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgfSxcbiAgICAgIGFzc2Vzc21lbnRUZXN0KCkge1xuICAgICAgICBjb25zdCBlbCA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Jlc291cmNlW3R5cGU9XCJpbXNxdGlfdGVzdF94bWx2M3AwXCJdJyk7XG4gICAgICAgIHJldHVybiB7IGhyZWY6IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpLCBpZGVudGlmaWVyOiBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiLCAiXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSBhbmQgdHJhbnNmb3JtIFFUSSB0ZXN0cy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UgYW5kIHRyYW5zZm9ybSBRVEkgdGVzdHMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1UZXN0KCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdodHRwczovL2V4YW1wbGUuY29tL3Rlc3QueG1sJyk7XG4gKiBjb25zdCBpdGVtcyA9IHF0aVRyYW5zZm9ybWVyLml0ZW1zKCk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKi9cblxuaW1wb3J0IHsgaXRlbXNGcm9tVGVzdCwgbG9hZFhNTCwgcGFyc2VYTUwsIHRvSFRNTCB9IGZyb20gXCIuL3F0aS10cmFuc2Zvcm1lcnNcIjtcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICBsb2FkOiAodXJpOiBzdHJpbmcpID0+IFByb21pc2U8dHJhbnNmb3JtVGVzdEFwaT47XG4gICAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtVGVzdEFwaTtcbiAgICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1UZXN0QXBpO1xuICAgIGl0ZW1zOiAoKSA9PiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXTtcbiAgICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gICAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xuICB9XG4gIFxuICBleHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtVGVzdCA9ICgpOiB0cmFuc2Zvcm1UZXN0QXBpID0+IHtcbiAgICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuICBcbiAgICBjb25zdCBhcGk6dHJhbnNmb3JtVGVzdEFwaSA9IHtcbiAgICAgIGFzeW5jIGxvYWQodXJpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0cmFuc2Zvcm1UZXN0QXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbG9hZFhNTCh1cmkpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG4gICAgICBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQpO1xuICAgICAgfSxcbiAgICAgIGh0bWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgICAgfSxcbiAgICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgaHRtbERvYygpIHtcbiAgICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgICAgcmV0dXJuIHhtbEZyYWdtZW50O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwaTtcbiAgfTsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxJQUFNQSxFQUFNLE9BQU8sSUFlYkMsRUFBWUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkF5QlgsU0FBU0UsRUFBa0JDLEVBQTBCQyxFQUFpQkMsRUFBbUIsQ0FDOUZGLEVBQVksaUJBQWlCQyxDQUFPLEVBQUUsUUFBUUUsR0FBVyxDQUN2RCxJQUFNQyxFQUFhLEdBQUdILENBQU8sSUFBSUMsQ0FBUyxHQUNwQ0csRUFBYUMsRUFBNEJILEVBQVNDLENBQVUsRUFDbEVELEVBQVEsWUFBWUUsQ0FBVSxDQUNoQyxDQUFDLENBQ0gsQ0FHTyxTQUFTRSxFQUF3QlAsRUFBMEJRLEVBQTBCLENBQzFGUixFQUFZLGlCQUFpQixHQUFHLEVBQUUsUUFBUUcsR0FBVyxDQUNuRCxJQUFNTSxFQUFZTixFQUFRLFVBQ3RCTSxHQUNGQSxFQUFVLFFBQVFDLEdBQWEsQ0FDN0IsR0FBSUEsRUFBVSxXQUFXLEdBQUdGLENBQWdCLEdBQUcsRUFBRyxDQUNoRCxJQUFNRyxFQUFTRCxFQUFVLE1BQU0sR0FBR0YsQ0FBZ0IsSUFBSSxNQUFNLEVBQ3RESixFQUFhLEdBQUdELEVBQVEsUUFBUSxJQUFJUSxDQUFNLEdBQzFDTixFQUFhQyxFQUE0QkgsRUFBU0MsQ0FBVSxFQUNsRUQsRUFBUSxZQUFZRSxDQUFVLENBQ2hDLENBQ0YsQ0FBQyxDQUVMLENBQUMsQ0FDSCxDQUdBLFNBQVNDLEVBQTRCSCxFQUFTQyxFQUFZLENBQ3hELElBQU1DLEVBQWEsU0FBUyxjQUFjRCxDQUFVLEVBRXBELFFBQVdRLEtBQVFULEVBQVEsV0FDekJFLEVBQVcsYUFBYU8sRUFBSyxLQUFNQSxFQUFLLEtBQUssRUFHL0MsS0FBT1QsRUFBUSxZQUNiRSxFQUFXLFlBQVlGLEVBQVEsVUFBVSxFQUUzQyxPQUFPRSxDQUNULENBRU8sU0FBU1EsRUFBY2IsRUFBK0IsQ0FDM0QsSUFBTWMsRUFBa0UsQ0FBQyxFQUN6RSxPQUFBZCxFQUFZLGlCQUFpQix5QkFBeUIsRUFBRSxRQUFRZSxHQUFNLENBQ3BFLElBQU1DLEVBQWFELEVBQUcsYUFBYSxZQUFZLEVBQ3pDRSxFQUFPRixFQUFHLGFBQWEsTUFBTSxFQUM3QkcsRUFBV0gsRUFBRyxhQUFhLFVBQVUsRUFDM0NELEVBQU0sS0FBSyxDQUFFLFdBQUFFLEVBQVksS0FBQUMsRUFBTSxTQUFBQyxDQUFTLENBQUMsQ0FDM0MsQ0FBQyxFQUNNSixDQUNULENBRUEsSUFBSUssRUFBd0MsS0FFckMsU0FBU0MsRUFBUUMsRUFBS0MsRUFBd0IsR0FBTyxDQUMxRCxPQUFJQSxHQUF5QkgsSUFBbUIsTUFDOUNBLEVBQWUsTUFBTSxFQUdoQixJQUFJLFFBQTRCLENBQUNJLEVBQVNDLElBQVcsQ0FDMUQsSUFBTUMsRUFBTSxJQUFJLGVBQ2hCTixFQUFpQk0sRUFFakJBLEVBQUksS0FBSyxNQUFPSixFQUFLLEVBQUksRUFDekJJLEVBQUksYUFBZSxXQUVuQkEsRUFBSSxPQUFTLElBQU0sQ0FDYkEsRUFBSSxRQUFVLEtBQU9BLEVBQUksT0FBUyxJQUNwQ0YsRUFBUUUsRUFBSSxXQUFXLEVBRXZCRCxFQUFPQyxFQUFJLFVBQVUsQ0FFekIsRUFFQUEsRUFBSSxRQUFVLElBQU0sQ0FDbEJELEVBQU9DLEVBQUksVUFBVSxDQUN2QixFQUVBQSxFQUFJLEtBQUssQ0FDWCxDQUFDLENBQ0gsQ0FFTyxTQUFTQyxFQUFTQyxFQUFxQixDQUc1QyxPQUZlLElBQUksVUFBVSxFQUNGLGdCQUFnQkEsRUFBYSxVQUFVLENBRXBFLENBRU8sU0FBU0MsRUFBTzVCLEVBQXlDLENBQzlELElBQU02QixFQUFZLElBQUksY0FDaEJDLEVBQWUsSUFBSSxVQUFVLEVBQUUsZ0JBQWdCaEMsRUFBVyxVQUFVLEVBQzFFLE9BQUErQixFQUFVLGlCQUFpQkMsQ0FBWSxFQUNkRCxFQUFVLG9CQUFvQjdCLEVBQWEsUUFBUSxDQUU5RSxDQUVPLFNBQVMrQixFQUFZL0IsRUFBK0JnQyxFQUFrQixDQUN0RUEsRUFBUyxTQUFTLEdBQUcsSUFDeEJBLEdBQVksS0FHZGhDLEVBQVksaUJBQWlCLDZCQUE2QixFQUFFLFFBQVFpQyxHQUFhLENBM0luRixJQUFBQyxFQTRJSSxJQUFJdEIsRUFBNkMsR0FFN0NxQixFQUFVLGFBQWEsS0FBSyxJQUM5QnJCLEVBQU8sT0FFTHFCLEVBQVUsYUFBYSxNQUFNLElBQy9CckIsRUFBTyxRQUVMcUIsRUFBVSxhQUFhLGNBQWMsSUFDdkNyQixFQUFPLGdCQUVULElBQU11QixHQUFZRCxFQUFBRCxFQUFVLGFBQWFyQixDQUFJLElBQTNCLFlBQUFzQixFQUE4QixPQUVoRCxHQUFJLENBQUNDLEVBQVUsV0FBVyxPQUFPLEdBQUssQ0FBQ0EsRUFBVSxXQUFXLE1BQU0sRUFBRyxDQUNuRSxJQUFNQyxFQUFjSixFQUFXLFVBQVVHLENBQVMsRUFDbERGLEVBQVUsYUFBYXJCLEVBQU13QixDQUFXLENBQzFDLENBQ0YsQ0FBQyxDQUNILENBRU8sU0FBU0MsRUFBc0JyQyxFQUErQixDQUM3Q0EsRUFBWSxpQkFBaUIsc0RBQXNELEVBQzNGLFFBQVFHLEdBQVcsQ0FDL0IsSUFBTW1DLEVBQWMsU0FBUyxjQUFjbkMsRUFBUSxXQUFXLEVBQzlEQSxFQUFRLGFBQWFtQyxFQUFhbkMsRUFBUSxVQUFVLENBQ3RELENBQUMsQ0FDSCxDQUVPLFNBQVNvQyxFQUFpQnZDLEVBQStCLENBRTlEQSxFQUFZLGlCQUFpQixnQkFBZ0IsRUFBRSxRQUFRd0MsR0FBY0EsRUFBVyxPQUFPLENBQUMsQ0FDMUYsQ0MvSE8sSUFBTUMsRUFBbUIsSUFBTSxDQUNwQyxJQUFJQyxFQUVFQyxFQUF3QixDQUM1QixNQUFNLEtBQUtDLEVBQWFDLEVBQXdCLEdBQTRCLENBQzFFLE9BQU8sSUFBSSxRQUFvQixDQUFDQyxFQUFTQyxJQUFXLENBQ2xEQyxFQUFRSixFQUFLQyxDQUFxQixFQUFFLEtBQUtJLElBQ3ZDUCxFQUFjTyxFQUdkTixFQUFJLEtBQUtDLEVBQUksVUFBVSxFQUFHQSxFQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsRUFDeENFLEVBQVFILENBQUcsRUFDbkIsQ0FDSCxDQUFDLENBQ0gsRUFDQSxNQUFNTyxFQUErQixDQUNuQyxPQUFBUixFQUFjUyxFQUFTRCxDQUFTLEVBQ3pCUCxDQUNULEVBQ0EsS0FBT1MsSUFDTEMsRUFBWVgsRUFBYVUsQ0FBUSxFQUMxQlQsR0FFVCxHQUFHVyxFQUFvRCxDQUNyRCxPQUFBQSxFQUFHWixDQUFXLEVBQ1BDLENBQ1QsRUFDQSxTQUFTQyxFQUF5QixDQUNoQyxJQUFNVyxFQUFhLENBQUMsT0FBUSxRQUFRLEVBQzlCQyxFQUFlWixFQUFJLFVBQVUsRUFBR0EsRUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUMxRCxRQUFXYSxLQUFhRixFQUNBYixFQUFZLGlCQUFpQixJQUFNZSxFQUFZLEdBQUcsRUFDMUQsUUFBUUMsR0FBUSxDQUM1QixJQUFNQyxFQUFXRCxFQUFLLGFBQWFELENBQVMsRUFDeEMsQ0FBQ0UsRUFBUyxXQUFXLE9BQU8sR0FBSyxDQUFDQSxFQUFTLFdBQVcsTUFBTSxJQUc5REQsRUFBSyxhQUFhLFdBQVlkLENBQUcsRUFDakNjLEVBQUssYUFDSCxTQUNBRixFQUFlLElBQU0sVUFBVUcsR0FBWUEsRUFBUyxTQUFTLEtBQUssRUFBSSxHQUFLLE1BQU0sQ0FDbkYsRUFFSixDQUFDLEVBRUgsT0FBT2hCLENBQ1QsRUFDQSxrQkFBbUIsQ0FBQ2lCLEVBQWlCQyxLQUNuQ0MsRUFBa0JwQixFQUFha0IsRUFBU0MsQ0FBUyxFQUMxQ2xCLEdBRVQsd0JBQXlCLENBQUNvQixFQUFnQixZQUN4Q0MsRUFBd0J0QixFQUFhcUIsQ0FBSyxFQUNuQ3BCLEdBRVQsa0JBQWtCc0IsRUFBaUJDLEVBQThCLENBQy9ELElBQU1DLEVBQXVCekIsRUFBWSxjQUFjLHdCQUF3QixFQUN6RTBCLEVBQTZCRCxFQUFxQixjQUFjLFFBQVEsRUFFOUUsT0FBQUEsRUFBcUIsYUFBYSxnQkFBaUJGLENBQU8sRUFDMURFLEVBQXFCLGFBQWEsaUJBQWtCRixFQUFVQyxDQUFRLEVBQ3RFQyxFQUFxQixhQUFhLE9BQVFDLEVBQTJCLGFBQWEsTUFBTSxDQUFDLEVBQ3pGRCxFQUFxQixhQUFhLFFBQVNDLEVBQTJCLGFBQWEsT0FBTyxDQUFDLEVBQzNGRCxFQUFxQixhQUFhLFNBQVVDLEVBQTJCLGFBQWEsUUFBUSxDQUFDLEVBRTdGRCxFQUFxQixZQUFZQyxDQUEwQixFQUNwRHpCLENBQ1QsRUFDQSx1QkFBb0MsQ0FDbEMsT0FBQTBCLEVBQXNCM0IsQ0FBVyxFQUMxQkMsQ0FDVCxFQUNBLGtCQUErQixDQUM3QixPQUFBMkIsRUFBaUI1QixDQUFXLEVBQ3JCQyxDQUNULEVBQ0EsTUFBTyxDQUNMLE9BQU8sSUFBSSxjQUFjLEVBQUUsa0JBQWtCNEIsRUFBTzdCLENBQVcsQ0FBQyxDQUNsRSxFQUNBLEtBQWMsQ0FDWixPQUFPLElBQUksY0FBYyxFQUFFLGtCQUFrQkEsQ0FBVyxDQUMxRCxFQUNBLFNBQVUsQ0FDUixPQUFPNkIsRUFBTzdCLENBQVcsQ0FDM0IsRUFDQSxRQUFzQixDQUNwQixPQUFPQSxDQUNULENBQ0YsRUFDQSxPQUFPQyxDQUNULEVDcElPLElBQU02QixFQUF1QixJQUc3QixDQUNILElBQUlDLEVBRUVDLEVBQU0sQ0FDVixNQUFNLEtBQUtDLEVBQUssQ0FDZCxPQUFPLElBQUksUUFBb0IsQ0FBQ0MsRUFBU0MsSUFBVyxDQUNsREMsRUFBUUgsQ0FBRyxFQUFFLEtBQUtJLElBQ2hCTixFQUFjTSxFQUNQSCxFQUFRRixDQUFHLEVBQ25CLENBQ0gsQ0FBQyxDQUNILEVBQ0EsTUFBTU0sRUFBbUIsQ0FDdkJQLEVBQWNRLEVBQVNELENBQVMsQ0FDbEMsRUFDQSxnQkFBaUIsQ0FDZixJQUFNRSxFQUFLVCxFQUFZLGNBQWMsc0NBQXNDLEVBQzNFLE1BQU8sQ0FBRSxLQUFNUyxFQUFHLGFBQWEsTUFBTSxFQUFHLFdBQVlBLEVBQUcsYUFBYSxZQUFZLENBQUUsQ0FDcEYsQ0FDRixFQUNBLE9BQU9SLENBQ1QsRUNETyxJQUFNUyxFQUFtQixJQUF3QixDQUN0RCxJQUFJQyxFQUVFQyxFQUF1QixDQUMzQixNQUFNLEtBQUtDLEVBQUssQ0FDZCxPQUFPLElBQUksUUFBMEIsQ0FBQ0MsRUFBU0MsSUFBVyxDQUN4REMsRUFBUUgsQ0FBRyxFQUFFLEtBQUtJLElBQ2hCTixFQUFjTSxFQUNQSCxFQUFRRixDQUFHLEVBQ25CLENBQ0gsQ0FBQyxDQUNILEVBQ0EsTUFBTU0sRUFBbUIsQ0FDdkIsT0FBQVAsRUFBY1EsRUFBU0QsQ0FBUyxFQUN6Qk4sQ0FDVCxFQUNBLEdBQUdRLEVBQXdDLENBQ3pDLE9BQUFBLEVBQUdULENBQVcsRUFDUEMsQ0FDVCxFQUNBLE9BQVEsQ0FDTixPQUFPUyxFQUFjVixDQUFXLENBQ2xDLEVBQ0EsTUFBTyxDQUNMLE9BQU8sSUFBSSxjQUFjLEVBQUUsa0JBQWtCVyxFQUFPWCxDQUFXLENBQUMsQ0FDbEUsRUFDQSxLQUFjLENBQ1osT0FBTyxJQUFJLGNBQWMsRUFBRSxrQkFBa0JBLENBQVcsQ0FDMUQsRUFDQSxTQUFVLENBQ1IsT0FBT1csRUFBT1gsQ0FBVyxDQUMzQixFQUNBLFFBQXNCLENBQ3BCLE9BQU9BLENBQ1QsQ0FDRixFQUNBLE9BQU9DLENBQ1QiLAogICJuYW1lcyI6IFsieG1sIiwgInhtbFRvSFRNTCIsICJleHRlbmRFbGVtZW50TmFtZSIsICJ4bWxGcmFnbWVudCIsICJ0YWdOYW1lIiwgImV4dGVuc2lvbiIsICJlbGVtZW50IiwgIm5ld1RhZ05hbWUiLCAibmV3RWxlbWVudCIsICJjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUiLCAiZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MiLCAiY2xhc3NOYW1lUGF0dGVybiIsICJjbGFzc0xpc3QiLCAiY2xhc3NOYW1lIiwgInN1ZmZpeCIsICJhdHRyIiwgIml0ZW1zRnJvbVRlc3QiLCAiaXRlbXMiLCAiZWwiLCAiaWRlbnRpZmllciIsICJocmVmIiwgImNhdGVnb3J5IiwgImN1cnJlbnRSZXF1ZXN0IiwgImxvYWRYTUwiLCAidXJsIiwgImNhbmNlbFByZXZpb3VzUmVxdWVzdCIsICJyZXNvbHZlIiwgInJlamVjdCIsICJ4aHIiLCAicGFyc2VYTUwiLCAieG1sRG9jdW1lbnQiLCAidG9IVE1MIiwgInByb2Nlc3NvciIsICJ4c2x0RG9jdW1lbnQiLCAic2V0TG9jYXRpb24iLCAibG9jYXRpb24iLCAiZWxXaXRoU3JjIiwgIl9hIiwgImF0dHJWYWx1ZSIsICJuZXdTcmNWYWx1ZSIsICJjb252ZXJ0Q0RBVEF0b0NvbW1lbnQiLCAiY29tbWVudFRleHQiLCAic3RyaXBTdHlsZVNoZWV0cyIsICJzdHlsZXNoZWV0IiwgInF0aVRyYW5zZm9ybUl0ZW0iLCAieG1sRnJhZ21lbnQiLCAiYXBpIiwgInVyaSIsICJjYW5jZWxQcmV2aW91c1JlcXVlc3QiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAibG9hZFhNTCIsICJ4bWwiLCAieG1sU3RyaW5nIiwgInBhcnNlWE1MIiwgImxvY2F0aW9uIiwgInNldExvY2F0aW9uIiwgImZuIiwgImF0dHJpYnV0ZXMiLCAiZG9jdW1lbnRQYXRoIiwgImF0dHJpYnV0ZSIsICJub2RlIiwgInNyY1ZhbHVlIiwgInRhZ05hbWUiLCAiZXh0ZW5zaW9uIiwgImV4dGVuZEVsZW1lbnROYW1lIiwgInBhcmFtIiwgImV4dGVuZEVsZW1lbnRzV2l0aENsYXNzIiwgImJhc2VSZWYiLCAiYmFzZUl0ZW0iLCAicXRpQ3VzdG9tSW50ZXJhY3Rpb24iLCAicXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QiLCAiY29udmVydENEQVRBdG9Db21tZW50IiwgInN0cmlwU3R5bGVTaGVldHMiLCAidG9IVE1MIiwgInF0aVRyYW5zZm9ybU1hbmlmZXN0IiwgInhtbEZyYWdtZW50IiwgImFwaSIsICJ1cmkiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAibG9hZFhNTCIsICJ4bWwiLCAieG1sU3RyaW5nIiwgInBhcnNlWE1MIiwgImVsIiwgInF0aVRyYW5zZm9ybVRlc3QiLCAieG1sRnJhZ21lbnQiLCAiYXBpIiwgInVyaSIsICJyZXNvbHZlIiwgInJlamVjdCIsICJsb2FkWE1MIiwgInhtbCIsICJ4bWxTdHJpbmciLCAicGFyc2VYTUwiLCAiZm4iLCAiaXRlbXNGcm9tVGVzdCIsICJ0b0hUTUwiXQp9Cg==